package in.lib.handler.base;
import in.lib.Debug;
import in.lib.manager.APIManager;
import in.model.Channel;
import in.model.SimpleUser;
import in.model.User;
import in.model.base.NetObject;
import in.obj.StreamMarker;
import in.rob.client.page.base.ChannelStreamFragment;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
/**
* Standard response handler for Channel streams.
*
* Use {@link #getChannels()} in {@link #onCallback()} to get the returned channels
*/
public abstract class ChannelStreamResponseHandler extends StreamResponseHandler<ChannelStreamFragment>
{
public ChannelStreamResponseHandler(Context c, boolean append)
{
super(c, append);
}
@Override public void onSuccess()
{
JsonElement elements = getContent();
if (elements != null)
{
try
{
JsonArray jPosts = elements.getAsJsonObject().get("data").getAsJsonArray();
List<String> downloadIds = new ArrayList<String>();
int size = jPosts.size();
setObjects(new ArrayList<NetObject>(size));
for (int index = 0; index < size; index++)
{
JsonObject channel = jPosts.get(index).getAsJsonObject();
Channel p = new Channel().createFrom(channel);
if (p == null)
{
continue;
}
for (String uId : p.getReaders())
{
if (!User.userSaved(uId))
{
if (!downloadIds.contains(uId))
{
downloadIds.add(uId);
}
}
else
{
p.getUsers().add(SimpleUser.parseFromUser(User.loadUser(uId)));
}
}
getObjects().add(p);
}
if (elements.getAsJsonObject().has("meta"))
{
JsonObject meta = elements.getAsJsonObject().get("meta").getAsJsonObject();
if (meta.has("max_id"))
{
setFirstId(meta.get("max_id").getAsString());
}
else if (getObjects().size() > 0)
{
setFirstId(getObjects().get(0).getId());
}
if (meta.has("min_id"))
{
setLastId(meta.get("min_id").getAsString());
}
else if (getObjects().size() > 0)
{
setLastId(getObjects().get(getObjects().size() - 1).getId());
}
if (meta.has("more"))
{
setHasMore(meta.get("more").getAsBoolean());
}
setMarker(StreamMarker.fromObject(meta));
}
// download all user's which we dont already have cached
if (downloadIds.size() > 0)
{
final ChannelStreamResponseHandler that = this;
APIManager.getInstance().getUsers(getContext(), downloadIds, new UserStreamResponseHandler(getContext(), false)
{
@Override public void onCallback()
{
int index = 0;
for (NetObject channelObject : that.getObjects())
{
Channel channel = (Channel)channelObject;
for (NetObject userObject : this.getObjects())
{
if (channel.getReaders().contains(userObject.getId()))
{
channel.getUsers().add(SimpleUser.parseFromUser((User)userObject));
}
}
}
that.onCallback();
}
@Override public void onFailure()
{
Debug.out(getConnectionInfo());
that.onFailure();
}
});
}
else
{
onCallback();
}
}
catch (Exception e)
{
Debug.out(e);
setDidFail(true);
}
}
else
{
setDidFail(true);
}
return;
}
}